/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package DAO;

import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author Anonymous
 */
public class DatVeDAO {
    
    //Hàm đặt vé
    public static boolean ThemDatVe(DTO.DatVeDTO dvdto){
        if(VeChuaDat(dvdto.getSoLuongVe(),dvdto.getMaChuyen(),dvdto.getCMND()))
        {
            int ms=LayMa();
            
            dvdto.setNgayDat(new java.util.Date());//lấy ngày giờ hiện tại
            java.sql.Date datet = new java.sql.Date(dvdto.getNgayDat().getTime());//gán vào ngày giờ hiện tại vào datet
            try{

                //ma hoa so luong ve
                String soluongve=MaHoa.MaHoa(dvdto.getSoLuongVe()+"");
                //ma hoa cmnd
                String CMND=MaHoa.MaHoa(dvdto.getCMND());
                //ma hoa thanh toan
                String ThanhToan=MaHoa.MaHoa("0");
                //ma hoa trangthai
                String TrangThai=MaHoa.MaHoa("0");
                Connect.connect();
                PreparedStatement ps;

                //Thực hiện đặt vé vào sql server
                ps= Connect.con.prepareCall("insert into T_DatVe(MaDatVe,MaChuyen,SoLuongVe,NgayDat,CMND,DaThanhToan,TrangThai) "
               + "values(?,?,?,?,?,?,?)");
                ps.setInt(1, ms);
                ps.setInt(2, dvdto.getMaChuyen());
                ps.setNString(3, soluongve);
                ps.setTimestamp(4,new java.sql.Timestamp(datet.getTime()));
                ps.setNString(5, CMND);
                ps.setNString(6, ThanhToan);
                ps.setNString(7, TrangThai);
                
                if(ps.executeUpdate()!=0){//Nếu thành công
                    System.out.println("insert successfull");
                    Connect.con.close();
                    return true;
                }
                else{
                    System.out.println("insert fail");
                    Connect.con.close();
                    return false;
                }  
            }
            catch (SQLException ex) {
                Logger.getLogger(ChuyenXeDAO.class.getName()).log(Level.SEVERE, null, ex);
            }
            try {
                Connect.con.close();
            } catch (SQLException ex) {
                Logger.getLogger(ChuyenXeDAO.class.getName()).log(Level.SEVERE, null, ex);
            }
            return false;
        }
        else
            return false;
    }
    
    //Hàm tạo mã cho đặt vé
    public static  int LayMa(){
            String sql = "select top 1 MaDatVe from T_DatVe order by MaDatVe desc";
            ResultSet kq=Connect.Xlsql(sql);//thực hiện câu truy vấn đưa kết quả vào resultset
            int maso = 0;
            try{
                if(kq.next()){
                    maso=kq.getInt("MaDatVe");
 
                    Connect.con.close();
                }
            }
            catch(SQLException ex){
                System.out.println(ex.getMessage());
            }
            return maso+1;     
        }
    
    //Hàm lấy số vé chưa đặt
   public static  boolean VeChuaDat(int sv,int mc,String CMND){
            sv=sv+SoVeDD(mc,CMND);
            BUS.ChuyenXeBUS cxbus=new BUS.ChuyenXeBUS();
            DTO.ChuyenXeDTO cxdto=cxbus.ttChuyenXe(mc);
            if(cxdto.getGioiHanVe()>=sv)
            {
                int vdd=DAO.ChuyenXeDAO.SoVeDD(mc);
                int slv=cxdto.getSoLuongVe();
                int ct=slv-vdd;
                return (ct-sv>=0);
            }
            else
                return false;     
        }
   public static int SoVeDD(int machuyen,String cmND){
        int sv=0;
        //ma hoa cmnd
        String CMND=MaHoa.MaHoa(cmND);
        //ma hoa trangthai
        String trangthai=MaHoa.MaHoa("0");
        String sql = "select * from T_DatVe where MaChuyen="+machuyen +" AND CMND=N'"+CMND+"' AND TrangThai=N'"+trangthai+"'";
        ResultSet kq=Connect.Xlsql(sql);//thực hiện câu truy vấn đưa kết quả vào resultset
        try {
            while(kq.next()){
                    String sovedat=kq.getNString("SoLuongVe");
                    int svdat=Integer.parseInt(MaHoa.GiaiMa(sovedat));
                    sv+=svdat;
            }
        
            Connect.con.close();
        } catch (SQLException ex) {
            Logger.getLogger(ChuyenXeDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
        return sv;      
    }
   
   //Hàm lấy kiểm tra hết hạn thanh toán thì thiết lập TrangThai=1 : hết hạn
    public static boolean ktHanDatVe(){
        java.util.Date tam=new java.util.Date();
        java.sql.Date datet = new java.sql.Date(tam.getTime()-(1000*60*60*24));
        
        //ma hoa dathanhtoan
        String dathanhtoan=MaHoa.MaHoa("0");
        //ma hoa trangthai
        String trangthai=MaHoa.MaHoa("0");
        String sql = "select * from T_DatVe where DaThanhToan=N'"+dathanhtoan+"' AND TrangThai=N'"+trangthai+"' AND NgayDat<'"+new java.sql.Timestamp(datet.getTime())+"'";
        ResultSet kq=Connect.Xlsql(sql);//thực hiện câu truy vấn đưa kết quả vào resultset
        try {
            while(kq.next()){
                    CnDatVe(kq.getInt("MaDatVe"));
            }
            Connect.con.close();
        } catch (SQLException ex) {
            Logger.getLogger(ChuyenXeDAO.class.getName()).log(Level.SEVERE, null, ex);
            return false;
        }
        return true;      
    }
    //Hàm cập nhật hết hạn thanh toán đặt vé
    public static boolean CnDatVe(int MaDV) {
        //ma hoa trangthai
        String trangthai=MaHoa.MaHoa("1");
        try{
            Connect.connect();//mở kết nối sql server
            
            //Cập nhật thông tin chuyến xe
            PreparedStatement ps;
            ps= Connect.con.prepareCall("update T_DatVe set TrangThai=? where MaDatVe=?");
            ps.setInt(2, MaDV);
            ps.setNString(1, trangthai);
            if(ps.executeUpdate()!=0){//Nếu cập nhật thành công
                System.out.println("update successfull");
                Connect.con.close();//đóng kết nối sql server
                return true;
            }
            else{//ngược lại nếu thất bại
                System.out.println("update fail");
                Connect.con.close();//đóng kết nối sql server
                return false;
            }  
        }
        catch (SQLException ex) {
            Logger.getLogger(DatVeDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
        try {
            Connect.con.close();//đóng kết nối sql server
        } catch (SQLException ex) {
            Logger.getLogger(DatVeDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
        return false;
    }
}